#!/usr/bin/env python3
"""
AI提示词配置管理路由
提供提示词的CRUD操作
"""

from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required, get_jwt_identity
from datetime import datetime

from models import db, AIPromptConfig

# 创建蓝图
ai_prompts_bp = Blueprint('ai_prompts', __name__)

# 默认的Email提示词模板
DEFAULT_EMAIL_PROMPT = """你是一位专业的邮件内容分析师。你的任务是精准地总结任何类型的邮件，无论是个人通讯、工作往来，还是资讯订阅（如新闻、科技、产品更新等）。
请遵循以下指南，并使用**美观、易读的Markdown格式**输出总结：
1.  **识别邮件核心目的**：快速判断邮件的主要意图（是通知、请求、确认，还是资讯分享？）。
2.  **提取关键信息**：
    *   **对于普通邮件**：明确总结出发件人的核心诉求、需要你执行的行动（To-Dos）、以及重要的时间节点或截止日期。
    *   **对于订阅/资讯类邮件**：提炼出主要观点、核心事件、关键数据或新发布的功能。使用要点列表（bullet points）来呈现，使其清晰明了。
3.  **格式化输出**：
    *   使用 `#` 或 `##` 作为主标题，清晰概括邮件主题。
    *   使用加粗（`**`）突出显示人名、项目名、日期和关键术语。
    *   使用项目符号（`-` 或 `*`）来组织信息点，保持结构清晰。
    *   在不同信息模块之间适当使用空行，增加可读性。
    *   总结内容应保持客观、中立，忠于原文，不要添加个人评论或推断。
请对以下邮件内容进行总结：

邮件主题：{subject}
发件人：{sender}
邮件内容：
{content}

请用中文回复，格式清晰，重点突出。"""


@ai_prompts_bp.route('/', methods=['GET'])
@jwt_required()
def get_all_prompts():
    """获取当前用户的所有提示词配置"""
    try:
        current_user_id = int(get_jwt_identity())
        
        prompts = AIPromptConfig.query.filter_by(user_id=current_user_id).all()
        
        return jsonify({
            'success': True,
            'prompts': [prompt.to_dict() for prompt in prompts]
        }), 200
        
    except Exception as e:
        return jsonify({'error': str(e)}), 500


@ai_prompts_bp.route('/<string:module>', methods=['GET'])
@jwt_required()
def get_prompt_by_module(module):
    """获取指定模块的提示词配置"""
    try:
        current_user_id = int(get_jwt_identity())
        
        prompt = AIPromptConfig.query.filter_by(
            user_id=current_user_id,
            module=module
        ).first()
        
        if not prompt:
            # 如果不存在，创建默认配置
            if module == 'email':
                prompt = AIPromptConfig(
                    user_id=current_user_id,
                    module=module,
                    prompt_template=DEFAULT_EMAIL_PROMPT,
                    is_active=True
                )
                db.session.add(prompt)
                db.session.commit()
            else:
                return jsonify({'error': '该模块的提示词配置不存在'}), 404
        
        return jsonify({
            'success': True,
            'prompt': prompt.to_dict()
        }), 200
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': str(e)}), 500


@ai_prompts_bp.route('/', methods=['POST'])
@jwt_required()
def create_prompt():
    """创建新的提示词配置"""
    try:
        current_user_id = int(get_jwt_identity())
        data = request.get_json()
        
        # 验证必填字段
        if not data.get('module') or not data.get('prompt_template'):
            return jsonify({'error': '模块名称和提示词模板不能为空'}), 400
        
        # 检查是否已存在
        existing = AIPromptConfig.query.filter_by(
            user_id=current_user_id,
            module=data['module']
        ).first()
        
        if existing:
            return jsonify({'error': '该模块的提示词配置已存在，请使用更新接口'}), 400
        
        # 创建新配置
        prompt = AIPromptConfig(
            user_id=current_user_id,
            module=data['module'],
            prompt_template=data['prompt_template'],
            is_active=data.get('is_active', True)
        )
        
        db.session.add(prompt)
        db.session.commit()
        
        return jsonify({
            'success': True,
            'prompt': prompt.to_dict(),
            'message': '提示词配置创建成功'
        }), 201
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': str(e)}), 500


@ai_prompts_bp.route('/<int:prompt_id>', methods=['PUT'])
@jwt_required()
def update_prompt(prompt_id):
    """更新提示词配置"""
    try:
        current_user_id = int(get_jwt_identity())
        
        prompt = AIPromptConfig.query.filter_by(
            id=prompt_id,
            user_id=current_user_id
        ).first()
        
        if not prompt:
            return jsonify({'error': '提示词配置不存在'}), 404
        
        data = request.get_json()
        
        # 更新字段
        if 'prompt_template' in data:
            prompt.prompt_template = data['prompt_template']
        if 'is_active' in data:
            prompt.is_active = data['is_active']
        
        prompt.updated_at = datetime.utcnow()
        db.session.commit()
        
        return jsonify({
            'success': True,
            'prompt': prompt.to_dict(),
            'message': '提示词配置更新成功'
        }), 200
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': str(e)}), 500


@ai_prompts_bp.route('/<string:module>', methods=['PUT'])
@jwt_required()
def update_prompt_by_module(module):
    """通过模块名更新提示词配置（便捷方法）"""
    try:
        current_user_id = int(get_jwt_identity())
        
        prompt = AIPromptConfig.query.filter_by(
            user_id=current_user_id,
            module=module
        ).first()
        
        if not prompt:
            return jsonify({'error': '提示词配置不存在'}), 404
        
        data = request.get_json()
        
        # 更新字段
        if 'prompt_template' in data:
            prompt.prompt_template = data['prompt_template']
        if 'is_active' in data:
            prompt.is_active = data['is_active']
        
        prompt.updated_at = datetime.utcnow()
        db.session.commit()
        
        return jsonify({
            'success': True,
            'prompt': prompt.to_dict(),
            'message': '提示词配置更新成功'
        }), 200
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': str(e)}), 500


@ai_prompts_bp.route('/<int:prompt_id>', methods=['DELETE'])
@jwt_required()
def delete_prompt(prompt_id):
    """删除提示词配置"""
    try:
        current_user_id = int(get_jwt_identity())
        
        prompt = AIPromptConfig.query.filter_by(
            id=prompt_id,
            user_id=current_user_id
        ).first()
        
        if not prompt:
            return jsonify({'error': '提示词配置不存在'}), 404
        
        db.session.delete(prompt)
        db.session.commit()
        
        return jsonify({
            'success': True,
            'message': '提示词配置删除成功'
        }), 200
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': str(e)}), 500


@ai_prompts_bp.route('/<string:module>/reset', methods=['POST'])
@jwt_required()
def reset_prompt_to_default(module):
    """重置提示词为默认值"""
    try:
        current_user_id = int(get_jwt_identity())
        
        # 获取默认模板
        default_template = None
        if module == 'email':
            default_template = DEFAULT_EMAIL_PROMPT
        else:
            return jsonify({'error': '不支持的模块类型'}), 400
        
        # 查找或创建配置
        prompt = AIPromptConfig.query.filter_by(
            user_id=current_user_id,
            module=module
        ).first()
        
        if not prompt:
            # 创建新配置
            prompt = AIPromptConfig(
                user_id=current_user_id,
                module=module,
                prompt_template=default_template,
                is_active=True
            )
            db.session.add(prompt)
        else:
            # 更新为默认值
            prompt.prompt_template = default_template
            prompt.updated_at = datetime.utcnow()
        
        db.session.commit()
        
        return jsonify({
            'success': True,
            'prompt': prompt.to_dict(),
            'message': '提示词已重置为默认值'
        }), 200
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': str(e)}), 500

